#include "Acceptor.h"

#include <cerrno>
#include <cstring>

Acceptor::Acceptor(int port) : listenning_(false), socket_(Socket(socket(AF_INET, SOCK_STREAM, 0))){
    // 这里构造函数就负责调用socket, bind, listen这几个操作
    if (socket_.fd() == -1){
        // 表示出错, 异常抛出
        fprintf(stderr, "socket error : %s\n", strerror(errno));
        exit(1);
    }
    addr_ = InetAddress(port);
    socket_.bindAddress(addr_);
}


void Acceptor::listen() {
    listenning_ = true;
    /*if(::listen(socket_.fd(), 128) == -1) {
        fprintf(stderr, "listen error : %s\n", strerror(errno));
        // 这里记得要先释放服务器的sock资源
        exit(1);
        // 设置服务器异常结束
    }*/
    socket_.listen();
    // 当程序可读的时候就会调用我们定义的可读函数了
    handleRead();
}

void Acceptor::handleRead() {
    InetAddress peerAddr(0);
    // 要接收信息的客户端
    int client_sock = socket_.accept(&peerAddr);
    if (client_sock == -1){
        // 连接失败, 不调用方法了
        fprintf(stderr, "accept error %s\n", strerror(errno));
        return;
    }
    // 将保存的客户端信息发送到回调函数
    newConnectionCallback_(client_sock, peerAddr);
}

